home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 142
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin
/
tools
/
s_tool
/
jx270inq.c
< prev
next >
Wrap
Text File
|
1999-06-11
|
8KB
|
317 lines
#include <TNB.h>
#define BUSYS(MM) while( (MM)==8 )
#define DATAOUT (0x80000000)
int id=13;
main()
{
int i,j,m,n,x,y,z;
int md;
UNchar buf[512];
i=S_INQUIRY(96,id,buf);
dumps(buf,96);
for(i=0;i<200;buf[i++]=0);
buf[6]=0x33;
// buf[57]=0b01111000;
buf[30]=0x80;
buf[31]=0x80;
buf[32]=0x80;
buf[33]=0x05;
buf[34]=0x08;
buf[37]=0x03; //Padding
buf[48]=0xFF;
buf[49]=0x09;
buf[50]=0x60;
buf[51]=0xFF;
buf[53]=0x03;
buf[54]=0x18;
buf[55]=0x01;
buf[56]=0x84;
//=========== set window 発行
//printf("set window!!\n");
buf[0]=0;
buf[1]=0;
//==== プリスキャン
//--- 範囲設定
*(int*)&buf[14]=0; // 読み取り位置
*(int*)&buf[18]=0;
*(int*)&buf[22]=10224; // 読み取り幅 最大を設定
*(int*)&buf[26]=14064; // 最大を設定
//*(int*)&buf[22]=5020; // 読み取り幅 最大を設定
//*(int*)&buf[26]=7028; // 最大を設定
i=232; // DOT 指定
buf[53]=i/0x100;
buf[54]=i&0xFF;
i=480; // DOT 指定
buf[55]=i/0x100;
buf[56]=i&0xFF;
// *(short*)&buf[10]=0x320;
// *(short*)&buf[12]=0x320;
// buf[57]|=bit(3); // 校正早く
//--- モード設定
//if ( ImageColMode==0 ){ // 0;多値 1;二値
buf[34]=0x08; //
// if ( ImageMode==0 ) // 0;カラー 1;白黒
md=0x05; // モード フルカラー
// else md=0x02; // グレイスケール
//} else {
// buf[34]=0x01; //
// if ( ImageMode==0 ) // 0;カラー 1;白黒
// md=0x03; // カラー2値
// else md=0x00; // 単純2値
//}
buf[33]=md;
//buf[37]=0x80; // RIF=1 Padding=0
//buf[37]=0x01; // RIF=0 Padding=0
buf[65]=0x40;
dumps(buf,70);
BUSYS( i=_scsi_setwindow( id,70,buf) );
if ( i!=0 ){
if ( i==2 ){
i=request_disp(id);
if ( (i&0xFF)==5 )
return(-3);
//sprintf(buf,"SNS=%02X:ASC=%02X:ASCQ=%02X",i/0x10000,(i/0x100)&0xFF,i&0xFF );
//printf("JX エラーがでました。[set win.]\n%s\n",buf );
return(-99);
}
return(-2);
}
}
/*************************************************
DUMP
*************************************************/
void dumps(bb,ll)
UNchar *bb;
int ll;
{
int i,j,m,n,c;
for(j=0;j<ll;j+=16){
for(i=0;i<16;i++){
n=j+i;
if ( n>=ll )
break;
printf("%02X ",bb[n]);
}
printf(" ");
for(i=0;i<16;i++){
n=j+i;
if ( n>=ll )
break;
c=bb[n];
if ( c<0x20 )
c='.';
else if ( c>=0x80 && c<=0x9F )
c='.';
else if ( c>=0xE0 )
c='.';
putchar(c);
}
printf("\n");
}
return;
}
/************************************************
REQUEST
************************************************/
int request_disp(id)
int id;
{
static char *REQUEST_MSG[17] = {
"No Se(0): 装置には、異常は、なかった\n",
"Recovered Error (1): 装置自体のリトライ機能によりコマンドが正常に終了した\n",
"Not Ready (2): 装置自体に異常が発生し、オペレータの介入が必要であることを示"
"す\n",
"Medium Error (3): リード/ライト動作時において媒体に起因するエラーが発生し、"
"リトライでエラーが回復できなかった\n",
"Hardware Error (4): 装置のハードウェアに障害が発生し、コマンドの実行が正常終"
"了しなかった\n",
"Illegal Request(5):イニシエータからのコマンド・データに異常があり、コマンドの"
"実行ができなかった\n",
"Unit Attention (6): 装置がリセットされたことを示す。又メディアが入れ換えられた"
"ことも示す\n",
"Write Protected (7): ライト・プロテクト状態にあるときにライト動作を含むコマンド"
"を受け取ったことを示す\n",
"Blank Check (8): 読みだし中にブランク領域になった。又は、書き込み中にブランク領"
"域でない領域になった\n",
"Vendor Unique (9): メーカーごとに自由に使用可\n",
"Copy Aborted (A): Copy,Compare,Copy & Verifyコマンドがデバイス異常により中止し"
"た\n",
"Aborted Command (B): ターゲットがイニシエータからのコマンドをアボートしたこと"
"を示す\n",
"Equal (C): Searchコマンドで一致を検出した\n",
"Volume Overflow (D): データがバッファに残っているのに、デバイスは最終ブロック"
"に達してしまった\n",
"Miscompare (E): ソースデータとメディアから読み出したデータが一致しない\n",
"(F): 将来の拡張用\n",
"センス・コマンドでエラーが、発生しました。\n"
};
UNchar buf[256];
int sense,sensecode,qualifier,i;
for(i=0;i<200;buf[i++]=0);
if ( _scsi_request( 36, id, buf ) == 0 )
sense = (unsigned int)( buf[2] & 0x0f );
else sense = 16;
sensecode=buf[12];
qualifier=buf[13];
printf("Check Condition!! Sense Key = %2Xh\n",sense);
printf(" Sense code(ASC) = %2Xh\n",sensecode);
printf(" Qualifier(ASCQ) = %2Xh\n",qualifier);
printf(" Infomation = %02X%02X%02X%02Xh\n",buf[3],buf[4],buf[5],buf[6]);
printf(" SKSV = %1Xh\n",buf[15]/0x80);
printf(" Sense Key Specific = %02X%02X%02Xh\n",buf[15]&0x7F,buf[16],buf[17]);
printf(" Additional Sense Bytes = %02X %02X %02X %02X\n",buf[18],buf[19],buf[20],buf[21]);
//printf( REQUEST_MSG[sense] );
dumps(buf,36);
return( sense*0x10000+sensecode*0x100+qualifier );
}
/*+++++++++++++++++++++++++++++++++++++++++++*/
int request_disp2(id)
int id;
{
UNchar buf[256];
int sense,sensecode,qualifier;
//
if ( _scsi_request( 22, id, buf ) == 0 )
sense = (unsigned int)( buf[2] & 0x0f );
else sense = 16;
sensecode=buf[12];
qualifier=buf[13];
return( sense*0x10000+sensecode*0x100+qualifier );
}
/**************************************************
_scsi_setwindow(id,length,bufadds)
**************************************************/
int _scsi_setwindow(id,length,bufadds)
int id,length;
UNchar *bufadds;
{
static UNchar cm[10]={0x24,0+1,0,0, 0,0, 0,0,0, 0};
cm[6]=(length/0x10000)&0xFF;
cm[7]=(length/0x100) &0xFF;
cm[8]= length &0xFF;
return( _scsi_cmd( id, 10,cm, (length|DATAOUT),bufadds ) );
}
/*******************************************************
int scsi_cmd(
int id
SCSI-id
int len
CDB の長さ
unsigned char *buf
CDB のアドレス
int rlen
データ読み込みの場合、バイト数
データ書き込みの場合、バイト数|0x80000000
0ならデータ読み込み無し
unsigned char *buf2
データアドレス
********************************************************/
int _scsi_cmd( int ID, int len, unsigned char *buf, int rlen, unsigned char *buf2 )
{
int rc;
register int id asm("d4");
/* セレクションフェーズ */
id=ID;
rc = _scsi_select( id );
if ( rc!=0 ) return(-1);
/* コマンドフェース */
buf[1]=(buf[1]&0x1F)|(id/0x10000*0x20);
rc = _scsi_cmdout( len, buf );
if ( rc!=0 ) return(-1);
if( rlen != 0 ){
if ( rlen>0 ){
/* データインフェーズ */
rc = _scsi_datain( rlen, buf2 );
if ( rc==-1 )
return(-1);
if ( rc==-2 ){
rc=_scsi_cmd_sm();
if ( rc!=0 )
return(rc);
return(-2);
}
} else {
/* データアウトフェーズ */
rc = _scsi_dataout( rlen&0x7FFFFFFF, buf2 );
if ( rc==-1 )
return(-1);
if ( rc==-2 ){
rc=_scsi_cmd_sm();
if ( rc!=0 )
return(rc);
return(-2);
}
}
}
return( _scsi_cmd_sm() );
}
/*++++++++++++++*/
int _scsi_cmd_sm()
{
unsigned char status,msg;
int rc;
/* ステイタスフェーズ */
rc = _scsi_stsin( &status );
if ( rc!=0 ) return(-1);
/* メッセージフェーズ */
rc = _scsi_msgin( &msg );
if ( rc!=0 ) return(-1);
return( msg*0x10000 + status );
}
#if 0
i=S_INQUIRY(96,id,buf);
dumps(buf,96);
printf(" ADF とか = %02X \n",buf[36]);
printf(" Optical Resolution = %02X \n",buf[37]);
printf(" Maximum Resolution = %02X \n",buf[38]);
printf(" Trans. とか = %02X \n",buf[39]);
printf(" X-axis resolution(gray) = %04X \n",*(short*)&buf[40]);
printf(" Y-axis resolution(gray) = %04X \n",*(short*)&buf[42]);
printf(" X-axis resolution(color) = %04X \n",*(short*)&buf[44]);
printf(" Y-axis resolution(color) = %04X \n",*(short*)&buf[46]);
printf(" Maximum size to read by driver = %04X \n",*(short*)&buf[48]);
printf(" --- \nExtend scanner ability 1 = %02X \n",buf[50]);
printf(" Extend scanner ability 2 = %02X \n",buf[51]);
printf(" Extend scanner ability 3 = %02X \n",buf[52]);
#endif